package almacenes.controlador.administrar;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import almacenes.controlador.constantes.Constantes;
import almacenes.controlador.gestionar.GeneralMB;
import almacenes.modelo.entidad.Departamento;
import almacenes.modelo.entidad.Proveedor;
import almacenes.modelo.entidad.RolesUsuarioRel;
import almacenes.modelo.entidad.UsuarioMae;

import javax.faces.event.ValueChangeEvent;

import almacenes.modelo.entidad.TipoProveedor;
import almacenes.modelo.entidad.UsuarioMae;
import almacenes.modelo.excepcion.ExcepcionGeneral;
import almacenes.modelo.service.ProveedorService;
import almacenes.modelo.service.impl.ProveedorServiceImpl;
import almacenes.modelo.util.Utilitarios;



public class ProveedorMB extends GeneralMB{
	private static final String UNCHECKED = "unchecked";
	protected final Log logger = LogFactory.getLog(this.getClass());
	private List<Proveedor> lstProveedor, lstProveedorOperadorLogistico;
	private List<Proveedor> lstTipoProveedor;
	private ProveedorService objProveedorService;
	private byte idTipoProveedor = 0;
	private List<TipoProveedor> lstTiposProveedorCombo;
	private UsuarioMae objUsuario = new UsuarioMae();
	
	
	public ProveedorMB(){
		
		lstProveedor= new ArrayList<Proveedor>();
		obtenerProveedores();
		lstProveedorOperadorLogistico = new ArrayList<Proveedor>();
		obtenerProveedoresOperadorLogistico();

		objProveedorMain = new Proveedor();
		lstTiposProveedorCombo = new ArrayList<TipoProveedor>();
		Constantes.putObjectInSession("objUsuarioSession", objUsuario);
	}
	private Integer iIdEstadoMae;

	private Proveedor objProveedorMain;

	// Cantidades en las tablas
	private int iCanProveedores;

	
	
	public void intanciarUsuarioProvisional(){
		UsuarioMae objUsuario = new UsuarioMae();
		objUsuario.setIdUsuario(1);
		RolesUsuarioRel objRolesUsuarioRel= new RolesUsuarioRel();
		objRolesUsuarioRel.setIdRolUsuario(1);
		objRolesUsuarioRel.setUsuarioMae(objUsuario);
		Departamento objDepartamento = new Departamento();
		objDepartamento.setIdDepartamento(1);
		objRolesUsuarioRel.setDepartamento(objDepartamento);

		List<RolesUsuarioRel> lstRol = new ArrayList<RolesUsuarioRel>();
		lstRol.add(objRolesUsuarioRel);
	    objUsuario.setRolesUsuarioRelsForIdUsuario(lstRol);
	}
	
	
	@SuppressWarnings(UNCHECKED)
	public void obtenerProveedores(){
		this.logger.debug("obtenerTiposProveedores");
		try {
			lstProveedor = getProveedorService().obtenerProveedores();
		} catch (Exception ex) {
			this.logger.error(ex.getMessage(), ex);
			throw new FacesException(ex.getMessage(), ex);
		}
	}
	@SuppressWarnings(UNCHECKED)
	public void obtenerProveedoresOperadorLogistico(){
		this.logger.debug("obtenerProveedoresOperadorLogistico");
		try {
			lstProveedorOperadorLogistico = getProveedorService().obtenerProveedoresOperadorLogistico();
		logger.info("Tamanio lstProveedorOperadorLogistico : "+lstProveedorOperadorLogistico.size());
		} catch (Exception ex) {
			this.logger.error(ex.getMessage(), ex);
			throw new FacesException(ex.getMessage(), ex);
		}
	}
	
	@SuppressWarnings(UNCHECKED)
	public void obtenerGestorAlmacen(){
		this.logger.debug("obtenerGestorAlmacen");
		
		try {
			lstProveedorOperadorLogistico = getProveedorService().obtenerProveedoresOperadorLogistico();
		} catch (Exception ex) {
			this.logger.error(ex.getMessage(), ex);
			throw new FacesException(ex.getMessage(), ex);
		}
	}
	


	public List<Proveedor> getLstProveedorOperadorLogistico() {
		return lstProveedorOperadorLogistico;
	}


	public void setLstProveedorOperadorLogistico(
			List<Proveedor> lstProveedorOperadorLogistico) {
		this.lstProveedorOperadorLogistico = lstProveedorOperadorLogistico;
	}


	@SuppressWarnings("unchecked")
	public void obtenerProveedorPorTipo(){
		this.logger.info("obtenerProveedorPorTipo:*"+this.idTipoProveedor+"*");
		objProveedorService = new ProveedorServiceImpl();
		try {
			this.lstProveedor = objProveedorService.obtenerProveedoresPorTipo(this.idTipoProveedor);
		} catch (ExcepcionGeneral ex) {
			String sMensaje = "No se puedo inicializar lstTipoProveedor";
			this.logger.error(ex.getMessage());
			throw new FacesException(sMensaje, ex);
		}
	}

	public void obtenerProveedorPorTipo(ValueChangeEvent event) {
		this.idTipoProveedor = (Byte) event.getComponent().getAttributes()
				.get("value");

		this.logger.info("obtenerProveedorPorTipo ValueChangeEvent:*"
				+ this.idTipoProveedor + "*");
		obtenerProveedorPorTipo();
	}

	@SuppressWarnings(UNCHECKED)
	public void buscarProveedores() {

		System.out.println("DESCRIPCION: "
				+ this.objProveedorMain.getDescProveedor());
		System.out.println("RUC: " + this.objProveedorMain.getRuc());
		System.out.println("ESTADO: " + this.iIdEstadoMae);

		try {
			this.objProveedorMain.setIdEstadoMae(this.iIdEstadoMae);
			lstProveedor = objProveedorService.buscarProveedorMain(this.objProveedorMain);
			iCanProveedores = lstProveedor.size();

		} catch (ExcepcionGeneral e) {
			String sMensaje = "No se puedo inicializar lstUsuariosBus";
			this.logger.error(e.getMessage());
			throw new FacesException(sMensaje, e);
		}

	}

	public int listaProveedoresPrincipal() {
		int can = 0;
		this.logger.info("obtenerProveedorPorTipo:*" + this.idTipoProveedor
				+ "*");
		objProveedorService = new ProveedorServiceImpl();
		try {
			this.lstProveedor = objProveedorService.getListaProveedoresMain();
			can = this.lstProveedor.size();
		} catch (ExcepcionGeneral ex) {
			String sMensaje = "No se puedo inicializar listaProveedoresPrincipal";
			this.logger.error(ex.getMessage());
			throw new FacesException(sMensaje, ex);
		}

		return can;
	}

	public void insertProveedor(ActionEvent e) {
		String sMensaje = "";
		Proveedor objProv = new Proveedor();
		TipoProveedor objTipoProv = new TipoProveedor();

		System.out.println("xxxxxxx INSERTARE xxxxxxx: ");
		System.out.println("TIPO DE PROVEEDOR: " + idTipoProveedor);
		System.out.println("DESCRIPCION: "
				+ objProveedorMain.getDescProveedor());
		System.out.println("DIRECCION: " + objProveedorMain.getDireccion());
		System.out.println("TELEFONO: " + objProveedorMain.getTelefono());
		System.out.println("CARPETA: " + objProveedorMain.getCarpeta());
		
		objTipoProv.setIdTipoProveedor(idTipoProveedor);
		objProv.setDescProveedor(objProveedorMain.getDescProveedor());
		objProv.setTelefono(objProveedorMain.getTelefono());
		objProv.setDireccion(objProveedorMain.getDireccion());
		objProv.setRuc(objProveedorMain.getRuc());
		objProv.setCarpeta(objProveedorMain.getCarpeta());
		objProv.setIdEstadoMae(1);
		objProv.setFecReg(new Date());
		objProv.setTipoProveedor(objTipoProv);

		try {

			if (idTipoProveedor == 0) {

				Utilitarios.mensajeError("",
						"Debe seleccionar un tipo de proveedor");
			}
			else {
				sMensaje = objProveedorService.insertProveedor(objProv);
				Utilitarios.mensaje("", sMensaje);
				setLstProveedor(new ArrayList<Proveedor>());
				iCanProveedores = listaProveedoresPrincipal();
				setObjProveedorMain(new Proveedor());
				
			}

		} catch (ExcepcionGeneral ex) {
			sMensaje = "No se puedo inicializar insertProveedor";
			this.logger.error(ex.getMessage());
			throw new FacesException(sMensaje, ex);

		}

	}

	public void editProveedorBBVA() {

		String sMensaje = "";
		Proveedor objProv = new Proveedor();
		TipoProveedor objTipoProv = new TipoProveedor();

		System.out.println("xxxxxxx ACTUALIZARE xxxxxxx: ");
		System.out.println("TIPO DE PROVEEDOR: " + idTipoProveedor);
		System.out.println("DESCRIPCION: "+ objProveedorMain.getDescProveedor());
		System.out.println("DIRECCION: " + objProveedorMain.getDireccion());
		System.out.println("TELEFONO: " + objProveedorMain.getTelefono());
		System.out.println("ESTADO: " + iIdEstadoMae);
		System.out.println("RUC: " + objProveedorMain.getRuc());

		objTipoProv.setIdTipoProveedor(idTipoProveedor);
		objProv.setDescProveedor(objProveedorMain.getDescProveedor());
		objProv.setTelefono(objProveedorMain.getTelefono());
		objProv.setDireccion(objProveedorMain.getDireccion());
		objProv.setRuc(objProveedorMain.getRuc());
	    objProv.setIdEstadoMae(iIdEstadoMae);
	    objProv.setCarpeta(objProveedorMain.getCarpeta());
		objProv.setFecAct(new Date());
		objProv.setTipoProveedor(objTipoProv);

		try {

			if (idTipoProveedor == 0) {
				Utilitarios.mensajeError("",
						"Debe seleccionar un tipo de proveedor");
			} else if(iIdEstadoMae == -1){
				Utilitarios.mensajeError("", "Seleccione un estado");
			}else {
				sMensaje = objProveedorService.updateProveedor(objProv);
				Utilitarios.mensaje("", sMensaje);
				setLstProveedor(new ArrayList<Proveedor>());
				iCanProveedores = listaProveedoresPrincipal();
			}

		} catch (ExcepcionGeneral ex) {
			sMensaje = "No se puedo inicializar editProveedorBBVA";
			this.logger.error(ex.getMessage());
			throw new FacesException(sMensaje, ex);

		}

	}

	public void openEditProveedor() {

		setObjProveedorMain(new Proveedor());

		Map<String, String> paramMap = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap();

		int codUsu = Integer.parseInt(paramMap.get("codProv"));
		System.out.println("ME LLEGO EL CODIGO DE USUARIO EN EL PARAMETRO: "
				+ codUsu);

		try {

			objProveedorMain = objProveedorService.getProveedorEdit(codUsu);
			System.out.println("ME LLEGO EL USUARIO AL MB: "
					+ objProveedorMain.getDescProveedor());
			this.iIdEstadoMae = this.objProveedorMain.getIdEstadoMae();
			this.idTipoProveedor = this.objProveedorMain.getTipoProveedor().getIdTipoProveedor();

		} catch (ExcepcionGeneral ex) {
			String sMensaje = "No se puedo inicializar openEditProveedor";
			this.logger.error(ex.getMessage());
			throw new FacesException(sMensaje, ex);
		}

	}

	public void listaTipoProveedor() {

		this.logger.info("obtenerProveedorPorTipo:*" + this.idTipoProveedor
				+ "*");
		objProveedorService = new ProveedorServiceImpl();
		try {
			this.lstTiposProveedorCombo = objProveedorService
					.getTiposProveedor();
		} catch (ExcepcionGeneral ex) {
			String sMensaje = "No se puedo inicializar listaProveedoresPrincipal";
			this.logger.error(ex.getMessage());
			throw new FacesException(sMensaje, ex);
		}

	}
	
	public void actionpenRegister(ActionEvent a) {
		try {
			setObjProveedorMain(new Proveedor());
			//removeObjectInSession("iIdRolUser");

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public List<Proveedor> getLstProveedor() {
		if (lstProveedor.isEmpty()) {
			iCanProveedores = listaProveedoresPrincipal();
		}
		return lstProveedor;
	}

	public void setLstProveedor(List<Proveedor> lstProveedor) {
		this.lstProveedor = lstProveedor;
	}

	public byte getIdTipoProveedor() {
		return idTipoProveedor;
	}

	public void setIdTipoProveedor(byte idTipoProveedor) {
		this.idTipoProveedor = idTipoProveedor;
	}

	public List<Proveedor> getLstTipoProveedor() {
		if (lstTipoProveedor.isEmpty()) {
			obtenerProveedorPorTipo();
		}
		return lstTipoProveedor;
	}

	public void setLstTipoProveedor(List<Proveedor> lstTipoProveedor) {
		this.lstTipoProveedor = lstTipoProveedor;
	}

	public Proveedor getObjProveedorMain() {
		return objProveedorMain;
	}

	public void setObjProveedorMain(Proveedor objProveedorMain) {
		this.objProveedorMain = objProveedorMain;
	}

	public int getiCanProveedores() {
		return iCanProveedores;
	}

	public void setiCanProveedores(int iCanProveedores) {
		this.iCanProveedores = iCanProveedores;
	}

	public List<TipoProveedor> getLstTiposProveedorCombo() {
		if (lstTiposProveedorCombo.isEmpty()) {
			listaTipoProveedor();
		}
		return lstTiposProveedorCombo;
	}

	public void setLstTiposProveedorCombo(
			List<TipoProveedor> lstTiposProveedorCombo) {
		this.lstTiposProveedorCombo = lstTiposProveedorCombo;
	}

	public Integer getiIdEstadoMae() {
		return iIdEstadoMae;
	}

	public void setiIdEstadoMae(Integer iIdEstadoMae) {
		this.iIdEstadoMae = iIdEstadoMae;
	}

}
